package com.crcode.crm.utils;

//import java.io.BufferedReader;
//import java.io.File;
//import java.io.FileReader;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;

import org.apache.commons.lang.StringUtils;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.util.CellRangeAddress;
import org.apache.poi.ss.usermodel.CellStyle;
//import org.junit.Test;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;

/**
 * 利用开源组件POI动态导出EXCEL文档
 * 
 * @author xzq createtime 2017/06/06
 */
@SuppressWarnings("deprecation")
public class ExportExcelXTsts {
	/**
	 * 导出Excel
	 * 
	 * @param obj
	 * @return
	 * @author xzq
	 */
	@SuppressWarnings({"unused", "unchecked", "resource"})
	public void exportExcel(OutputStream out, JSONObject obj, String wjtitle) {
		try {
			// 声明一个工作薄
			HSSFWorkbook workbook = new HSSFWorkbook();
			// 获取excel表格数据
			JSONArray datas = JSONArray.parseArray(obj.getString("rows"));
			Integer total = datas.size();
			int mus = 65000;// 每个工作表格最多存储65000条数据（注：excel表格一个工作表可以存储65536条）
			int avg = total / mus;
			for (int s = 0; s < avg + 1; s++) {
				// 生成一个表格
				HSSFSheet sheet = workbook.createSheet(wjtitle + (s + 1));
				// 设置表格默认列宽度为15个字节
				sheet.setDefaultColumnWidth(20);
				// 创建单元格样式
				CellStyle style = workbook.createCellStyle();
				style.setBorderTop(CellStyle.NO_FILL); // 上边框-BORDER_MEDIUM-中等边框
				style.setBorderBottom(CellStyle.NO_FILL); // 下边框
				style.setBorderLeft(CellStyle.NO_FILL);
				style.setBorderRight(CellStyle.NO_FILL);
				style.setAlignment(CellStyle.ALIGN_CENTER);// 水平居中
				style.setVerticalAlignment(CellStyle.VERTICAL_CENTER);// 垂直居中
				/*
				 * //生成一个字体 --用于控制导出样式 HSSFFont font = workbook.createFont();
				 * //font.setColor(HSSFColor.VIOLET.index);
				 * font.setFontName("黑体"); font.setFontHeightInPoints((short)
				 * 12);// 字体大小 font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
				 * //把字体应用到当前的样式 style.setFont(font);
				 */
				
				// 设置列宽 ：第一个参数代表列id(从0开始),第2个参数代表宽度值 ；
				// sheet.setColumnWidth(0, 3766); 
				
				// 获取excel标题
				JSONArray columns = JSONArray.parseArray(obj.getString("column"));
				// 标题行数
				Integer titleSize = columns.size();
				// 用于合并行
				Integer rowspans = 0;
				int temp = 0;
				// 存放数据的map
				Map<String, Object> sjmap = new HashMap<String, Object>();
				for (int i = 0; i < titleSize; i++) {
					int k = 0;
					@SuppressWarnings("rawtypes")
					List<Map> titles  = JSON.parseArray(JSON.toJSONString(columns.get(i)),Map.class);
					// 产生表格标题行
					HSSFRow row = sheet.createRow(i);
					if (i == 1) {
						// 第二行---temp为要合并几个单元格
						for (int t = 0; t < temp; t++) {
							HSSFCell fcell = row.createCell(k++);
							sheet.addMergedRegion(new CellRangeAddress(0, rowspans - 1, k - 1, k - 1));
						}
					}
					// 遍历创建标题单元格
					for (Map<String, Object> title : titles) {
						if(!title.containsKey("field") || title.get("field").toString().equals("0")){
							continue;
						}
						if (title.get("field") != null) {
							sjmap.put(k + "", title.get("field"));
						}
						// 创建单元格
						Integer colspan = Integer
								.parseInt(title.containsKey("colspan") && title.get("colspan") != null? title.get("colspan").toString():"0" );
						Integer rowspan = Integer
								.parseInt(title.containsKey("rowspan") && title.get("rowspan") != null? title.get("rowspan").toString():"0" );
						// 用于第二行合并
						if (rowspan > 1) {
							temp++;
						}
						if (rowspan > rowspans) {
							rowspans = rowspan;
						}
						HSSFCell fcell = row.createCell(k++);
						fcell.setCellStyle(style);
						fcell.setCellValue(title.get("title").toString());
						if (colspan > 1) {
							HSSFCell fcell2 = row.createCell(k++);
							// 合并单元格
							/* 开始行，结束行，开始列，结束列 */
							sheet.addMergedRegion(new CellRangeAddress(0, 0, k - 2, k - 1));
						}
					}
				}
				// 遍历数据
				int k = 0;
				// 用于所有列创建之后合并单元格
				int num = s * mus;
				int index = 0;
				List<Map<String, Object>> rangelist = new ArrayList<Map<String, Object>>();
				for (int m = num; m < datas.size(); m++) {
					if (index == mus) {// 判断index == mus的时候跳出当前for循环
						break;
					}
					// sjmap
					HSSFRow row = sheet.createRow(titleSize++);
					Map<String, Object> data = (Map<String, Object>) datas.get(m);
					for (Entry<String, Object> en : sjmap.entrySet()) {
						Integer key = Integer.parseInt(en.getKey());
						String value = en.getValue().toString();
						// 创建单元格
						HSSFCell fcell = row.createCell(key);
						fcell.setCellStyle(style);
						if(value.equals("logType")){
							if(data.get(value) != null && data.get(value).toString().equals("0")){
								fcell.setCellValue("企业资源");
							}else if(data.get(value) != null && data.get(value).toString().equals("1")){
								fcell.setCellValue("项目资源");
							}
						}else if(value.equals("detailedType")){
							if(data.get(value) != null && data.get(value).toString().equals("0")){
								fcell.setCellValue("企业变更");
							}else if(data.get(value) != null && data.get(value).toString().equals("1")){
								fcell.setCellValue("企业维护进度变更");
							}else if(data.get(value) != null && data.get(value).toString().equals("2")){
								fcell.setCellValue("企业附件变更");
							}else if(data.get(value) != null && data.get(value).toString().equals("3")){
								fcell.setCellValue("项目变更");
							}else if(data.get(value) != null && data.get(value).toString().equals("4")){
								fcell.setCellValue("项目维护进度变更");
							}else if(data.get(value) != null && data.get(value).toString().equals("5")){
								fcell.setCellValue("项目方案变更");
							}
						}else if(value.equals("ent_industry_one")){
							if(data.get(value) == null||StringUtils.isBlank(data.get(value).toString())){
								fcell.setCellValue("");
							}else{
								JSONObject eio=JSONObject.parseObject(data.get(value).toString());
								fcell.setCellValue(eio==null?"":eio.getString("indName"));
							}
						}else if(value.equals("ent_needs_urgent") || value.equals("ent_needs_commonly")){
							fcell.setCellValue((data.get(value) == null||StringUtils.isBlank(data.get(value).toString())) ? "" : data.get(value).toString().replace("[", "").replace("]", "").replaceAll("\"", ""));
						}else{
							fcell.setCellValue((data.get(value) == null||StringUtils.isBlank(data.get(value).toString())) ? "" : data.get(value).toString());
						}
					}

					index++;
				}
				for (Map<String, Object> map : rangelist) {
					sheet.addMergedRegion(new CellRangeAddress(Integer.parseInt(map.get("rowstart").toString()),
							Integer.parseInt(map.get("rowend").toString()), Integer.parseInt(map.get("col").toString()),
							Integer.parseInt(map.get("col").toString())));
				}
			}
			workbook.write(out);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * 根据map的value信息返回key值
	 * 
	 * @author xzq
	 */
	public String getKey(Map<String, Object> map, String value) {
		Set<String> kset = map.keySet();
		for (String ks : kset) {
			if (map.get(ks).toString().equals(value)) {
				return ks;
			}
		}
		return "";
	}
//
//	@Test
//	public void test() {
//		File file = new File("C:\\Users\\xzq\\Desktop\\json数据\\统计分析\\全综统计\\全宗统计数据.js");
//		StringBuilder result = new StringBuilder();
//		try {
//			BufferedReader br = new BufferedReader(new FileReader(file));// 构造一个BufferedReader类来读取文件
//			String s = null;
//			while ((s = br.readLine()) != null) {// 使用readLine方法，一次读一行
//				result.append(System.lineSeparator() + s);
//			}
//			br.close();
//		} catch (Exception e) {
//			e.printStackTrace();
//		}
//		System.out.println(result);
//		// JSONObject obj=JSONObject.fromObject(result.toString());
//		// System.out.println(exportExcel(null,obj));
//	}
}
